perm filename SEC.SAI[4,KMC]1 blob
sn#177273 filedate 1975-09-17 generic text, type T, neo UTF8
COMMENT COMPARE compares 2 files and lists their differences or merges them;
BEGIN
REQUIRE "IODEFS.SAI[SEC,RCP]" SOURCE_FILE;
STRING PROC READ1;
BEGIN
STRING LINE;
DO LINE ← IN_LINE UNTIL LINE OR EOF;
RETURN(LINE);
END;
STRING PROC READ2;
BEGIN
STRING LINE;
DO LINE ← INPUT(INCH2, 1) UNTIL LINE OR EOF;
RETURN(LINE);
END;
PROC COMPARE(VALUE STRING MODE);
BEGIN
BOOLEAN DIF;
STRING WORD1, WORD2;
BREAK_BLANK;
DIF ← EQU(MODE, "DIF");
FILIN((FILE ← GET_A_STRING("1st file to compare")), INCH1);
FILOUT(SCAN(FILE, 7, BRK) & "." & MODE, OUCH1);
FILIN((FILE ← GET_A_STRING("2nd file to compare")), INCH2);
IF DIF THEN FILOUT(SCAN(FILE, 7, BRK) & ".DIF", OUCH2);
WORD1 ← READ1;
WORD2 ← READ2;
DO BEGIN
IF EQU(WORD1, WORD2) THEN
BEGIN
IF ¬DIF THEN OUT_LINE(WORD1);
WORD1 ← READ1;
WORD2 ← READ2;
END
ELSE IF ALPHA(WORD1, WORD2) > 0 THEN
BEGIN
OUT_LINE(WORD1);
WORD1 ← READ1;
END
ELSE BEGIN
IF DIF THEN OUT(OUCH2, WORD2 ↓)
ELSE OUT_LINE(WORD2);
WORD2 ← READ2;
END;
END
UNTIL EOF;
IF WORD1 THEN DO
BEGIN
OUT_LINE(WORD1);
WORD1 ← READ1;
END
UNTIL EOF
ELSE DO BEGIN
IF DIF THEN OUT(OUCH2, WORD2 ↓)
ELSE OUT_LINE(WORD2);
WORD2 ← READ2;
END
UNTIL EOF;
RELEASE(INCH1);
RELEASE(OUCH1);
RELEASE(INCH2);
IF DIF THEN RELEASE(OUCH2);
END;
α PAIRWISE compares lines of a file to find duplicates or insert blanks;
PROC PAIRWISE(VALUE STRING MODE);
BEGIN
BOOLEAN DUP;
STRING THIS, NEXT;
STRING THIS_KEY, NEXT_KEY;
BREAK_TAB;
DUP ← EQU(MODE, "DUP");
FILIN((FILE ← GET_A_STRING("File to examine")), INCH1);
FILOUT(SCAN(FILE, 7, BRK) & "." & MODE, OUCH1);
THIS ← IN_LINE;
THIS_KEY ← CAR(THIS);
IF ¬DUP THEN OUT_LINE(THIS);
NEXT ← IN_LINE;
WHILE ¬EOF DO
IF NEXT THEN
BEGIN
NEXT_KEY ← CAR(NEXT);
IF DUP THEN
BEGIN
IF EQU(THIS_KEY, NEXT_KEY) THEN
OUT_LINE(THIS ∂ NEXT);
END
ELSE BEGIN
IF ¬EQU(THIS_KEY, NEXT_KEY) THEN OUT_LINE(NULL);
OUT_LINE(NEXT);
END;
THIS ← NEXT;
THIS_KEY ← NEXT_KEY;
NEXT ← IN_LINE;
END
ELSE NEXT ← IN_LINE;
RELEASE(INCH1);
RELEASE(OUCH1);
END;
α SCREEN switches the members of a pair or finds chosen lines;
PROC SCREEN(VALUE STRING MODE);
BEGIN
BOOLEAN INV;
STRING LINE;
BREAK_TAB;
INV ← EQU(MODE, "INV");
FILIN((FILE ← GET_A_STRING("File to screen")), INCH1);
FILOUT(SCAN(FILE, 7, BRK) & "." & MODE, OUCH1);
EAT_DIR(LINE, INCH1);
LINE ← IN_LINE;
WHILE ¬EOF DO
IF LINE THEN
BEGIN
STRING FIRST, REST;
FIRST ← CAR(LINE);
REST ← CDR(LINE);
IF INV THEN OUT_LINE(REST & TAB & TAB & FIRST)
ELSE BEGIN
IF ¬EQU(FIRST, REST) THEN OUT_LINE(LINE);
END;
LINE ← IN_LINE;
END
ELSE LINE ← IN_LINE;
RELEASE(INCH1);
RELEASE(OUCH1);
END;
α ONE_SHOT does whatever special job I need done;
PROC ONE_SHOT;
BEGIN
STRING LINE;
BREAK_BLANK;
FILIN("DIC[PAR,RCP]", INCH1);
FILOUT("VERBS[PAR,RCP]", OUCH1);
EAT_DIR(LINE, INCH1);
WHILE (LINE ← IN_LINE) DO
OUT_LINE((SCAN(LINE, 2, BRK))[2 TO ∞]);
RELEASE(INCH1);
RELEASE(OUCH1);
END;
α This selects the requested routine;
WHILE TRUE DO
BEGIN
STRING JOB;
BREAK_LINE;
BREAK_EXT;
JOB ← GET_A_STRING(
"Compare, Merge, Dups, sPread, Switch, Redundant, One_shot, eXit");
IF JOB = "C" THEN COMPARE("DIF")
ELSE IF JOB = "M" THEN COMPARE("MRG")
ELSE IF JOB = "D" THEN PAIRWISE("DUP")
ELSE IF JOB = "P" THEN PAIRWISE("SPR")
ELSE IF JOB = "S" THEN SCREEN("INV")
ELSE IF JOB = "R" THEN SCREEN("RED")
ELSE IF JOB = "O" THEN ONE_SHOT
ELSE IF JOB = "X" THEN DONE
ELSE OUTSTR("You blew it" ↓);
END;
END